﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Lavanderia.Entities;
using Lavanderia.BL;
using Microsoft.Practices.Unity;
using System.IO;

namespace Lavanderia.UI
{
    public partial class FrmMttoUsuario : Form
    {
        [Dependency]
        public IUsuarioBL usuarioBL { get; set; }

        [Dependency]
        public IUsuarioMenuBL usuMenuBL { get; set; }

        [Dependency]
        public IMenuBL menuBL { get; set; }

        [Dependency]
        public ITrabajadorBL trabajadorBL { get; set; }

        [Dependency]
        public IRolBL rolBL { get; set; }

        [Dependency]
        public IFotoTrabajadorBL fotTrabajadorBL { get; set; }

        public FrmMttoUsuario()
        {
            InitializeComponent();
            this.BuilUp();

            rOLBindingSource.DataSource = rolBL.GetAllFromRol();
            mENUBindingSource.DataSource = menuBL.GetAllFromMenu();
        }

        bool isNew;
        int trabajadorId = 0;
        List<MENU> _listMenuPorAsignar;

        public void NuevoUsuario()
        {
            isNew = true;
            uSUARIOBindingSource.AddNew();
        }

        public USUARIO _usuario { get; set; }

        public void EditarUsuario()
        {
            isNew = false;
            uSUARIOBindingSource.DataSource = _usuario;

            txtTrabajador.Text = _usuario.TRABAJADOR.Dni;
            lblNomTrab.Text = _usuario.TRABAJADOR.NombreCompleto;
            trabajadorId = _usuario.IdTrabajador;

            //cargando la foto del trabajador
            var img = fotTrabajadorBL.GetFromFotoTrabajadorByTrabajadorId(_usuario.IdTrabajador);
            if (img.Imagen != null)
            {
                MemoryStream stream = new MemoryStream(img.Imagen);
                pbFoto.Image = Image.FromStream(stream);
            }
            else
            {
                pbFoto.Image = pbFoto.ErrorImage;
            }

            txtTrabajador.ReadOnly = true;
            gbDetalle.Enabled = true;
            gbMenu.Enabled = true;
            btnAdd.Enabled = true;
            btnQuitar.Enabled = true;
            btnGuardar.Enabled = true;
            btnAvanzar.Enabled = true;
            btnAtras.Enabled = true;
            btnAgregarTodo.Enabled = true;
        }

        private void FrmMttoUsuario_Load(object sender, EventArgs e)
        {
            _listMenuPorAsignar = new List<MENU>();
        }

        //verificamos el trabajador
        public void verificarTrabajador()
        {
            var trabajador = trabajadorBL.GetAllFromTrabajadorByDni(txtTrabajador.Text);
            var msg = "ERROR";

            try
            {
                usuarioBL.VerificarAsignacion(trabajador.Id);
                #region trabajadorNuevo
                if (trabajador != null)
                {
                    lblNomTrab.Text = trabajador.NombreCompleto;
                    trabajadorId = trabajador.Id;

                    //cargando la foto del trabajador
                    var img = fotTrabajadorBL.GetFromFotoTrabajadorByTrabajadorId(trabajador.Id);
                    if (img.Imagen != null)
                    {
                        MemoryStream stream = new MemoryStream(img.Imagen);
                        pbFoto.Image = Image.FromStream(stream);
                    }
                    else
                    {
                        pbFoto.Image = pbFoto.ErrorImage;
                    }

                    passwordTextBox.ReadOnly = false;
                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("Trabajdor no Existe, ¿Desea crear un Trabajador?"), "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (rpt == DialogResult.Yes)
                    {
                        FrmTrabajador frm = new FrmTrabajador();
                        frm.Extend();
                        frm.ShowDialog();

                        if (frm.currentTrabajador != null)
                        {
                            lblNomTrab.Text = frm.currentTrabajador.NombreCompleto;
                            trabajadorId = trabajador.Id;

                            //cargando la foto del trabajador
                            var img = fotTrabajadorBL.GetFromFotoTrabajadorByTrabajadorId(frm.currentTrabajador.Id);
                            if (img.Imagen != null)
                            {
                                MemoryStream stream = new MemoryStream(img.Imagen);
                                pbFoto.Image = Image.FromStream(stream);
                            }
                            else
                            {
                                pbFoto.Image = pbFoto.ErrorImage;
                            }

                            passwordTextBox.ReadOnly = false;
                        }
                    }
                }
                #endregion
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                var rpt = MessageBox.Show(msg, "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                this.Close();
            }
        }

        //eventos para trarer al trabajador por DNI
        private void txtTrabajador_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                verificarTrabajador();
            }
        }

        private void txtTrabajador_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
                verificarTrabajador();
            }
        }

        //validamos el ingreso de solo NUMEROS para el DNI del trabajdor
        private void txtTrabajador_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsNumber(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        //validamos que el PASSWD sean mayor a 6 DIGITOS
        private void passwordTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (passwordTextBox.Text.Length >= 6)
                {
                    gbDetalle.Enabled = true;
                    gbMenu.Enabled = true;
                    btnAdd.Enabled = true;
                    btnQuitar.Enabled = true;
                    btnGuardar.Enabled = true;
                    btnAvanzar.Enabled = true;
                    btnAtras.Enabled = true;
                    btnAgregarTodo.Enabled = true;
                }
                else
                {
                    MessageBox.Show("Ingrese un Password mayor o igual a 6 caracteres", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void passwordTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
                if (passwordTextBox.Text.Length >= 6)
                {
                    gbDetalle.Enabled = true;
                    gbMenu.Enabled = true;
                    btnAdd.Enabled = true;
                    btnQuitar.Enabled = true;
                    btnGuardar.Enabled = true;
                    btnAvanzar.Enabled = true;
                    btnAtras.Enabled = true;
                    btnAgregarTodo.Enabled = true;
                }
                else
                {
                    MessageBox.Show("Ingrese un Password mayor o igual a 6 caracteres", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        //btn ADD MENUS al detalle
        private void btnAdd_Click(object sender, EventArgs e)
        {
            var menu = mENUBindingSource.Current as MENU;
            var currentUsuario = uSUARIOBindingSource.Current as USUARIO;

            if (menu != null)
            {
                var detalle = new USUARIO_MENU
                {
                    IdUsuario = trabajadorId,
                    IdMenu = menu.Id,
                    MENU = menu,
                    USUARIO = currentUsuario
                };

                var existe = currentUsuario.USUARIO_MENU.Where(d => d.MENU.Id.Equals(menu.Id)).SingleOrDefault();

                if (existe == null)
                {
                    currentUsuario.USUARIO_MENU.Add(detalle);
                }
                else
                {
                    MessageBox.Show(detalle.MENU.Descripcion + " ya se encuentra agregado", "Mensaje", MessageBoxButtons.OK);
                }

                _listMenuPorAsignar.Add(menu);
                uSUARIOBindingSource.ResetBindings(true);
                uSUARIO_MENUBindingSource1.ResetBindings(true);
            }
        }

        //btn DELETE MENUS del detalle
        private void btnQuitar_Click(object sender, EventArgs e)
        {
            var detalleMenu = uSUARIO_MENUBindingSource1.Current as USUARIO_MENU;
            var usuario = uSUARIOBindingSource.Current as USUARIO;

            if (detalleMenu != null)
            {
                var rpt = MessageBox.Show(this, string.Format("¿Desea Quitar el Menú: {0} ?", detalleMenu.MENU.Descripcion), "Quitar Equipo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (rpt == DialogResult.Yes)
                {
                    uSUARIO_MENUBindingSource1.RemoveCurrent();
                }
            }
            else
            {
                MessageBox.Show("Debe selecionar un menú para poder Quitar");
            }
            uSUARIOBindingSource.ResetBindings(true);
            uSUARIO_MENUBindingSource1.ResetBindings(true);
        }

        private void btnAgregarTodo_Click(object sender, EventArgs e)
        {
            var listaMenuTodos = mENUBindingSource.DataSource as List<MENU>;
            var currentUsuario = uSUARIOBindingSource.Current as USUARIO;

            if (listaMenuTodos != null)
            {
                foreach (var lista in listaMenuTodos)
                {
                    var detalle = new USUARIO_MENU
                    {
                        IdUsuario = trabajadorId,
                        IdMenu = lista.Id,
                        MENU = lista,
                        USUARIO = currentUsuario
                    };

                    var existe = currentUsuario.USUARIO_MENU.Where(d => d.MENU.Id.Equals(lista.Id)).SingleOrDefault();

                    if (existe == null)
                    {
                        currentUsuario.USUARIO_MENU.Add(detalle);
                    }
                    else
                    {
                        MessageBox.Show(detalle.MENU.Descripcion + " ya se encuentra agregado", "Mensaje", MessageBoxButtons.OK);
                    }

                    _listMenuPorAsignar.Add(lista);
                    uSUARIOBindingSource.ResetBindings(true);
                    uSUARIO_MENUBindingSource1.ResetBindings(true);
                }
            }
        }

        //función de encriptacion MD5 para password
        public string md5()
        {
            System.Security.Cryptography.MD5 md5;
            md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();

            byte[] encodedBytes = md5.ComputeHash(ASCIIEncoding.Default.GetBytes(passwordTextBox.Text));

            return System.Text.RegularExpressions.Regex.Replace(BitConverter.ToString(encodedBytes).ToUpper(), @"-", "");
        }

        //metodo para AVANZAR en la grilla
        public void Avanzar()
        {
            int[] listaSubPestanas = new int[]{1005, 1010, 1015, 1020, 1025, 1030, 1035, 1040, 1045,
                                                                2005, 2010, 2015,
                                                                2055, 2060, 2065, 
                                                                3005, 3010, 3020,
                                                                3055, 3060, 3065,
                                                                4005, 4015, 4020,
                                                                5005, 5010,};

            MENU currentMenu = mENUBindingSource.Current as MENU;

            if (currentMenu.Tag == 1000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(1000);
            }
            else if (currentMenu.Tag == 2000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(2000);
            }
            else if (currentMenu.Tag == 2050)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(2050);
            }
            else if (currentMenu.Tag == 3000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(3000);
            }
            else if (currentMenu.Tag == 3050)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(3050);
            }
            else if (currentMenu.Tag == 4000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(4000);
            }
            else if (currentMenu.Tag == 5000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(5000);
            }
            else
            {
                foreach (var item in listaSubPestanas)
                {
                    if (currentMenu.Tag == item)
                    {
                        mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTag(item);
                    }
                }
            }
        }

        private void btnAvanzar_Click(object sender, EventArgs e)
        {
            Avanzar();
        }

        private void mENURadGridView_DoubleClick(object sender, EventArgs e)
        {
            Avanzar();
        }

        //metodo para RETROCEDER en la grilla
        public void Retroceder()
        {
            int[] listaPestDetalladas = new int[] { 1006, 1007, 1008, 1009, 1011, 1012, 1013, 1014, 1016, 1017, 1018, 1019,
                                                                    1021, 1022, 1023, 1024, 1026, 1027, 1028, 1029, 1031, 1032, 1033, 1034,
                                                                    1036, 1037, 1038, 1039, 1041, 1042, 1043, 1044, 1046, 1047, 1048, 1049,
                                                                    2006, 2007, 2008, 2009, 2011, 2012, 2013, 2014, 2016, 2017, 2018, 2019,
                                                                    2056, 2061, 2066, 2067, 2068, 
                                                                    3006, 3007, 3008, 3009, 3011, 3012, 3013, 3014, 3015,
                                                                    3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030,
                                                                    3056, 3057, 3058, 3059, 3061, 3062, 3063, 3064,
                                                                    3066, 3067, 3068, 3069, 3070, 3071, 3072, 3073,
                                                                    4006, 4007, 4008, 4009, 4010, 4016, 4017, 4018, 4019, 4021, 4022, 4023, 4024,
                                                                    5006, 5007, 5011, 5012};

            MENU currentMenu = mENUBindingSource.Current as MENU;

            if (currentMenu.Tag >= 1005 && currentMenu.Tag <= 2000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimeintoByTagByReturn(currentMenu.Tag);
            }
            else if (currentMenu.Tag >= 2005 && currentMenu.Tag <= 2030)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimeintoByTagByReturn(currentMenu.Tag);
            }
            else if (currentMenu.Tag >= 2055 && currentMenu.Tag <= 2090)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimeintoByTagByReturn(currentMenu.Tag);
            }
            else if (currentMenu.Tag >= 3005 && currentMenu.Tag <= 3040)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimeintoByTagByReturn(currentMenu.Tag);
            }
            else if (currentMenu.Tag >= 3055 && currentMenu.Tag <= 3090)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimeintoByTagByReturn(currentMenu.Tag);
            }
            else if (currentMenu.Tag >= 4005 && currentMenu.Tag <= 4090)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimeintoByTagByReturn(currentMenu.Tag);
            }
            else if (currentMenu.Tag >= 5005 && currentMenu.Tag <= 5090)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimeintoByTagByReturn(currentMenu.Tag);
            }
            else
            {
                foreach (var item in listaPestDetalladas)
                {
                    if (currentMenu.Tag == item)
                    {
                        mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimeintoByTagByReturn(item);
                    }
                }
            }
        }

        private void btnAtras_Click(object sender, EventArgs e)
        {
            Retroceder();
        }

        //GUARDANDO.......
        private void btnGuardar_Click(object sender, EventArgs e)
        {
            var usuario = uSUARIOBindingSource.Current as USUARIO;
            var msg = "ERROR";

            if (usuario != null)
            {
                if (isNew == true)
                {
                    try
                    {
                        usuario.Password = md5();
                        usuario.IdTrabajador = trabajadorId;
                        usuarioBL.AddUsuario(usuario);

                        MessageBox.Show("Registro Correcto", "Registro",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                if (isNew == false)
                {
                    try
                    {
                        usuario.IdTrabajador = trabajadorId;
                        usuarioBL.UpdateUsuario(usuario);

                        MessageBox.Show("Modificación Correcta", "Registro",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }
    }
}
